package br.com.esporte.view.site.grupo.comunidade.partida;

import java.util.ArrayList;
import java.util.List;

import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;

import br.com.esporte.exception.ViewException;
import br.com.esporte.model.Advertencia;
import br.com.esporte.model.DiaPraticadoGrupo;
import br.com.esporte.model.Grupo;
import br.com.esporte.model.Jogador;
import br.com.esporte.model.Partida;
import br.com.esporte.model.Time;
import br.com.esporte.persistence.filter.FiltroAdvertencia;
import br.com.esporte.persistence.filter.FiltroJogador;
import br.com.esporte.persistence.filter.FiltroPartida;
import br.com.esporte.persistence.filter.FiltroTime;
import br.com.esporte.view.infra.generic.Pagina;
import br.com.esporte.view.site.component.menu.menuTopo.MenuTopo;
import br.com.esporte.view.site.component.menu.menuTopo.MenuTopoComponente;
import br.com.esporte.view.site.component.partida.PartidaComponent;
import br.com.esporte.view.site.grupo.comunidade.PaginaComunidade;
import br.com.esporte.view.site.grupo.comunidade.diaPraticado.PaginaListarDiaPraticado;

/**
 * 
 * @author Milton Domingues
 *
 */
public class PaginaListarPartida extends PaginaComunidade{

	private DiaPraticadoGrupo diaPraticadoGrupo;
	private List<Partida> partidas;

	private static final String PARTIDA_ID = "partida";
	private static final String LISTA_PARTIDAS_ID = "listPartidas";
	private static final String LIST_MENUS_TOPO_ID = "menuTopo";


	public PaginaListarPartida(Grupo grupo, DiaPraticadoGrupo diaPraticadoGrupo) {
		setGrupo(grupo);
		setDiaPraticadoGrupo(diaPraticadoGrupo);
		carregarView();
		validarView();
		montarPagina();
	}

	private void carregarPartida(Partida partida){
		FiltroTime filtroTime = new FiltroTime();
		filtroTime.addEquals(FiltroTime.PARTIDA, partida);
		List<Time> times = getFachada().consultar(filtroTime);
		// popular times paeridas
		for (Time time : times) {
			// popular jogadores time
			FiltroJogador filtro = new FiltroJogador();
			filtro.addEquals(FiltroJogador.TIME, time);
			List<Jogador> jogadores = getFachada().consultar(filtro);

			// Populer advertencias jogador
			for (Jogador jogador : jogadores) {
				FiltroAdvertencia filtroAdv = new FiltroAdvertencia();
				filtroAdv.addEquals(FiltroAdvertencia.JOGADOR, jogador);
				List<Advertencia> advs = getFachada().consultar(filtroAdv);
				jogador.setAdvertencias(advs);
			}

			time.setJogadores(jogadores);
		}
		partida.setTimes(times);
	}

	@Override
	public void carregarView() {
		super.carregarView();
		FiltroPartida filtro = new FiltroPartida();
		filtro.addEquals(FiltroPartida.DIA_PRATICADO, getDiaPraticadoGrupo());
		setPartidas(getFachada().consultar(filtro));
	}

	private ListView<Partida> criarListPartidas(List<Partida> partidas){
		ListView<Partida> lista = new ListView<Partida>(LISTA_PARTIDAS_ID, partidas) {

			private static final long serialVersionUID = -7470855965169794327L;

			@Override
			protected void populateItem(ListItem<Partida> item) {
				Partida partida = item.getModelObject();
				carregarPartida(partida);
				PartidaComponent partidaComponent = new PartidaComponent(PARTIDA_ID, partida){
					private static final long serialVersionUID = -6467551031816525074L;
					@Override
					public void acaoEditar(Partida partida) {
						setResponsePage(new PaginaCriarPartida(getGrupo(), partida));
					}
					@Override
					public boolean habilitarEdicao() {
						return isModerador();
					}
				};
				item.add(partidaComponent);

			}
		};
		return lista;
	}

	private MenuTopoComponente criarMenuTopo(){
		return new MenuTopoComponente(LIST_MENUS_TOPO_ID, getMenusTopo(), getGrupo().getTipo());
	}

	public DiaPraticadoGrupo getDiaPraticadoGrupo() {
		return diaPraticadoGrupo;
	}

	private List<MenuTopo> getMenusTopo(){
		List<MenuTopo> list = new ArrayList<MenuTopo>();

		Link<Pagina> event1 = new Link<Pagina>(MenuTopoComponente.LINK_MENU_ID) {

			private static final long serialVersionUID = 6408049973489553594L;

			@Override
			public void onClick() {
				try{
					setResponsePage(new PaginaListarDiaPraticado(getGrupo(), getDiaPraticadoGrupo()));
				}catch (ViewException e) {
					redirectViewException(e);
				}
			}
		};
		list.add(new MenuTopo(event1, "Listar Dias Praticado"));

		return list;
	}

	public List<Partida> getPartidas() {
		return partidas;
	}

	@Override
	public void montarPagina() {
		super.montarPagina();
		addContainer(criarMenuTopo());
		addContainer(criarListPartidas(getPartidas()));
	}

	public void setDiaPraticadoGrupo(DiaPraticadoGrupo diaPraticadoGrupo) {
		this.diaPraticadoGrupo = diaPraticadoGrupo;
	}

	public void setPartidas(List<Partida> partidas) {
		this.partidas = partidas;
	}

	@Override
	public void validarView() {
		super.validarView();
		if(getDiaPraticadoGrupo() == null){
			throw new ViewException("Nenhuma Dia praticado Regiatrada");
		}
		if((getPartidas() == null) || (getPartidas().size() == 0)){
			throw new ViewException("Nenhuma partida Regiatrada");
		}
	}

	@Override
	public boolean viewPublica() {
		return true;
	}
}
